#ifndef RISCV_H
#define RISCV_H

#include <stdint.h>

// --------------------------
// RISC-V 控制寄存器定义（机器模式）
// --------------------------

// 机器状态寄存器（mstatus）
#define MSTATUS_MIE (1 << 3)   // 机器模式全局中断使能位
#define MSTATUS_MPIE (1 << 7)  // 保存的机器模式中断使能位（用于中断嵌套）
#define MSTATUS_SPP (1 << 8)   // 超级模式之前的特权级（暂时不用）

// 机器中断使能寄存器（mie）
#define MIE_MTIE (1 << 7)  // 机器模式定时器中断使能
#define MIE_MEIE (1 << 11) // 机器模式外部中断使能（PLIC相关）
#define MIE_MSIE (1 << 3)  // 机器模式软件中断使能（暂时不用）

// 机器陷阱向量寄存器（mtvec）
#define MTVEC_DIRECT 0x1   // 直接模式（所有中断跳转到同一入口）
#define MTVEC_VECTORED 0x2 // 向量模式（不同中断跳转到不同入口）

// --------------------------
// 寄存器读写内联函数（通过CSR指令）
// --------------------------

// 读控制寄存器（csrr）
static inline uint64_t r_csr(uint16_t csr) {
    uint64_t value;
    __asm__ __volatile__("csrr %0, %1" : "=r"(value) : "i"(csr));
    return value;
}

// 写控制寄存器（csrw）
static inline void w_csr(uint16_t csr, uint64_t value) {
    __asm__ __volatile__("csrw %0, %1" : : "i"(csr), "r"(value));
}

// 读-修改-写控制寄存器（csrrs：保留置位的位）
static inline uint64_t rw_csr_set(uint16_t csr, uint64_t mask) {
    uint64_t value;
    __asm__ __volatile__("csrrs %0, %1, %2" : "=r"(value) : "i"(csr), "r"(mask));
    return value;
}

// 读-修改-写控制寄存器（csrrc：保留清零的位）
static inline uint64_t rw_csr_clear(uint16_t csr, uint64_t mask) {
    uint64_t value;
    __asm__ __volatile__("csrrc %0, %1, %2" : "=r"(value) : "i"(csr), "r"(mask));
    return value;
}

// --------------------------
// 常用寄存器操作封装
// --------------------------

// 机器状态寄存器（mstatus）
static inline uint64_t r_mstatus(void) { return r_csr(0x300); }
static inline void w_mstatus(uint64_t value) { w_csr(0x300, value); }

// 机器中断使能寄存器（mie）
static inline uint64_t r_mie(void) { return r_csr(0x304); }
static inline void w_mie(uint64_t value) { w_csr(0x304, value); }

// 机器陷阱向量寄存器（mtvec）
static inline uint64_t r_mtvec(void) { return r_csr(0x305); }
static inline void w_mtvec(uint64_t value) { w_csr(0x305, value); }

// 机器异常程序计数器（mepc）：保存中断发生时的指令地址
static inline uint64_t r_mepc(void) { return r_csr(0x341); }
static inline void w_mepc(uint64_t value) { w_csr(0x341, value); }

// 机器异常原因寄存器（mcause）：保存中断/异常的原因
static inline uint64_t r_mcause(void) { return r_csr(0x342); }
static inline void w_mcause(uint64_t value) { w_csr(0x342, value); }

// 机器hart ID寄存器（mhartid）：当前核心ID
static inline uint32_t r_mhartid(void) { return (uint32_t)r_csr(0xf14); }

// 等待中断指令（wfi）：让CPU进入低功耗状态，等待中断唤醒
static inline void wfi(void) {
    __asm__ __volatile__("wfi");
}

#endif  // RISCV_H
